// routes/analytics.js
const express = require('express');
const router = express.Router();
const AnalyticsEvent = require('../models/AnalyticsEvent');

// POST /api/track - 接收前端上报的数据
router.post('/track', async (req, res) => {
    const eventData = req.body;

    // 基本验证 (可以做得更严格)
    if (!eventData || !eventData.eventType || !eventData.userId || !eventData.pageViewId) {
        return res.status(400).json({ message: 'Missing required event data.' });
    }

    try {
        // 如果是 pageview 事件，我们创建一个新的记录
        // 如果是 pageleave 或 heartbeat，理论上应该更新对应的 pageview 记录，
        // 但为了简化，我们也可以都存为独立事件，查询时再关联。
        // 这里采用简单方式：全部存为独立事件。

        const event = new AnalyticsEvent(eventData);
        await event.save();

        // 对于 sendBeacon，即使成功，通常也不返回内容或只返回 204 No Content
        // 对于普通 POST，可以返回 201 Created 或 200 OK
        res.status(201).json({ message: 'Event tracked successfully.' });

    } catch (error) {
        console.error('Error saving analytics event:', error);
        res.status(500).json({ message: 'Internal server error.' });
    }
});

// GET /api/stats - 查询统计数据的示例 API (需要根据需求实现)
router.get('/stats', async (req, res) => {
    // 注意：实际应用中，数据量大时应进行聚合计算，避免实时查询全量数据
    // 这里仅作演示，实际应优化或使用聚合框架/定时任务

    const { startDate, endDate, url } = req.query; // 接收查询参数

    const query = {};
    if (startDate || endDate) {
        query.timestamp = {};
        if (startDate) query.timestamp.$gte = newDate(startDate);
        if (endDate) query.timestamp.$lte = newDate(endDate);
    }
     if (url) {
        query.url = url; // 可按特定页面查询
    }

    try {
        // 1. 计算 PV (页面浏览量)
        const pvQuery = { ...query, eventType: 'pageview' };
        const totalPV = await AnalyticsEvent.countDocuments(pvQuery);

        // 2. 计算 UV (独立访客数)
        // distinct() 在大数据量下性能可能不高，考虑 MapReduce 或 Aggregation Framework
        const uvQuery = { ...query, eventType: 'pageview' }; // 通常基于 pageview 计算 UV
        const distinctUsers = await AnalyticsEvent.distinct('userId', uvQuery);
        const totalUV = distinctUsers.length;

        // 3. 计算平均停留时长 (基于 pageleave 事件中的 duration)
        // 这是一个简化的计算，更精确需要处理心跳和会话
        const leaveEvents = await AnalyticsEvent.find({
            ...query,
            eventType: 'pageleave',
            duration: { $exists: true, $gt: 0 } // 只统计有有效时长的离开事件
        }).select('duration');

        let totalDuration = 0;
        leaveEvents.forEach(event => {
            totalDuration += event.duration;
        });
        const averageDuration = leaveEvents.length > 0 ? (totalDuration / leaveEvents.length / 1000).toFixed(2) : 0; // 转为秒

        res.json({
            totalPV,
            totalUV,
            averageDurationSeconds: parseFloat(averageDuration)
            // 可以添加更多统计维度，如 Top Pages, Referrers 等
        });

    } catch (error) {
        console.error('Error fetching stats:', error);
        res.status(500).json({ message: 'Error fetching stats.' });
    }
});


module.exports = router;